from datetime import date, timedelta

from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.goods.models import GoodsVisitCount
from apps.meiduo_admin.serializers.categorys import GoodsSerializer
from apps.users.models import User


# 普通用户总量
class UserTotalCountView(APIView):

    # 指定管理员用户操作权限
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 1. 查询出所有普通用户数量
        counts = User.objects.filter(is_staff=False).count()
        # 2. 返回数据
        return Response({
            'count': counts,
        })


# 日增用户数量
class UserDayCountView(APIView):

    # 指定管理员用户操作权限
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 1. 查询出当天日期
        now_date = date.today()
        # 2. 根据用户注册时间字段查询出大于等于当天日期的用户数量
        counts = User.objects.filter(date_joined__gte=now_date, is_staff=False).count()
        # 3. 返回数据
        return Response({
            'count': counts,
        })


# 日活跃用户统计
class UserActiveCountView(APIView):

    # 指定管理员用户操作权限
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 1. 查询出当天日期
        now_date = date.today()
        # 2. 根据用户最后登录时间字段查询出大于等于当天日期的用户数量
        counts = User.objects.filter(last_login__gte=now_date, is_staff=False).count()
        # 3. 返回数据
        return Response({
            'count': counts,
        })


# 日下单用户量统计
class UserOrderCountView(APIView):

    # 指定管理员用户操作权限
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 1. 查询出当天日期
        now_date = date.today()
        # 2. 根据订单表创建时间字段关联查询出用户表中当天下单的用户数量
        # orderinfo__create_time 是关联查询出订单的创建时间
        # 对下订单用户进行去重
        users = set(User.objects.filter(orderinfo__create_time__gte=now_date, is_staff=False))
        counts = len(users)
        return Response({
            'count': counts
        })


# 月增用户统计
class UserMonthCountView(APIView):

    # 指定管理员用户操作权限
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 1. 获取当前日期
        now_date = date.today()
        # 2. 获取一个月前日期
        start_date = now_date - timedelta(29)

        # 创建新列表保存一个月的用户增量
        date_list = []
        # 3. 循环遍历一个月内每天用户增量
        for day in range(30):
            # 当天
            index_date = start_date + timedelta(days=day)
            # 下一天
            next_date = start_date + timedelta(days=(day + 1))
            # 查询条件是大于当天, 小于下一天
            count = User.objects.filter(date_joined__gte=index_date,
                                        date_joined__lt=next_date,
                                        is_staff=False).count()
            date_list.append({
                'count':count,
                'date':index_date
            })

        return Response(date_list)


# 日分类商品访问量
class GoodsDayView(APIView):

    # 指定管理员用户操作权限
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 1. 获取当前日期
        now_date = date.today()
        # 2. 获取当天商品访问量
        goods_count = GoodsVisitCount.objects.filter(date=now_date)
        # # 3. 构造返回数据
        # goods_list = []
        # for good_count in goods_count:
        #     goods_list.append({
        #         'count':good_count.count,
        #         'category':good_count.category.name
        #     })

        # return Response(goods_list)

        # 3. 使用序列化器构造返回数据
        s = GoodsSerializer(goods_count, many=True)

        return Response(s.data)